#include "viml/builtin_type.h"
#include <stdexcept>

namespace viml {

Value type_builtin(const std::vector<Value>& args) {
    // 检查参数数量
    if (args.size() != 1) {
        throw std::runtime_error("type() takes exactly 1 argument (" + std::to_string(args.size()) + " given)");
    }
    
    const Value& value = args[0];
    
    // 根据值的类型返回对应的类型常量
    switch (value.type()) {
        case ValueType::NIL:
            return Value::make_number(0);  // v:t_number (特殊：null被视为数字0)
        case ValueType::NUMBER:
            return Value::make_number(0);  // v:t_number
        case ValueType::FLOAT:
            return Value::make_number(5);  // v:t_float
        case ValueType::STRING:
            return Value::make_number(1);  // v:t_string
        case ValueType::BOOLEAN:
            return Value::make_number(6);  // v:t_bool
        case ValueType::LIST:
            return Value::make_number(3);  // v:t_list
        case ValueType::DICT:
            return Value::make_number(4);  // v:t_dict
        case ValueType::FUNCTION:
        case ValueType::CLOSURE:
        case ValueType::BUILTIN:
            return Value::make_number(2);  // v:t_function
        case ValueType::NONE:
            return Value::make_number(0);  // v:t_number (特殊：none被视为数字0)
        default:
            // 默认情况，返回number类型
            return Value::make_number(0);
    }
}

} // namespace viml